bitkeeper revision 1.1159.172.1 (4194ce42z4ANVXzSMk0doSVOCKrA1g)
authorcl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>
Fri, 12 Nov 2004 14:52:50 +0000 (14:52 +0000)
committercl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>
Fri, 12 Nov 2004 14:52:50 +0000 (14:52 +0000)
Add no-defer keyhandlers which get called from interrupt context and get
access to the registers saved on interrupt entry.

xen/common/keyhandler.c
xen/drivers/char/console.c
xen/include/xen/keyhandler.h

index d52aabd771255172ad8ba751901592c8d2dd3b31..045f8618801b3709723683ddaa6998cc5cff669f 100644 (file)
 #define STR_MAX  64
 
 static struct { 
-    key_handler *handler; 
+    key_handler *handler;
+    int          flags;
     char         desc[STR_MAX]; 
 } key_table[KEY_MAX]; 
 
+#define KEYHANDLER_NO_DEFER 0x1
+
 static unsigned char keypress_key;
 
 void keypress_softirq(void)
@@ -25,19 +28,33 @@ void keypress_softirq(void)
         (*h)(key);
 }
 
-void handle_keypress(unsigned char key)
+void handle_keypress(unsigned char key, struct xen_regs *regs)
 {
+    key_handler  *h;
+
     keypress_key = key;
-    raise_softirq(KEYPRESS_SOFTIRQ);
+    if ( (key_table[key].flags & KEYHANDLER_NO_DEFER) &&
+         ((h = key_table[key].handler) != NULL) )
+        ((void (*)(unsigned char, struct xen_regs *))*h)(key, regs);
+    else
+        raise_softirq(KEYPRESS_SOFTIRQ);
 }
 
 void add_key_handler(unsigned char key, key_handler *handler, char *desc)
 {
-    key_table[key].handler = handler; 
+    key_table[key].handler = handler;
+    key_table[key].flags = 0;
     strncpy(key_table[key].desc, desc, STR_MAX);
     key_table[key].desc[STR_MAX-1] = '\0'; 
 }
 
+void add_key_handler_no_defer(unsigned char key, key_handler *handler,
+                              char *desc)
+{
+    add_key_handler(key, handler, desc);
+    key_table[key].flags |= KEYHANDLER_NO_DEFER;
+}
+
 static void show_handlers(unsigned char key)
 {
     int i; 
index 51e97fc82f28340c65f61e68f20a1350929b784f..7a706b2e2c1eda2e63298a77789ece95025f1fa9 100644 (file)
@@ -247,7 +247,7 @@ static void __serial_rx(unsigned char c, struct xen_regs *regs)
 {
     if ( xen_rx )
     {
-        handle_keypress(c);
+        handle_keypress(c, regs);
     }
     else if ( (serial_rx_prod-serial_rx_cons) != SERIAL_RX_SIZE )
     {
index d12621ef335dbd44eef30d5e5795a2d98d52bd43..09e2f234ad56a6951a15cd66114a6d723d2b7b43 100644 (file)
@@ -4,12 +4,13 @@
 ** debug flag, dump registers, reboot, etc) to be hooked in in a slightly
 ** nicer fashion than just editing the serial/keyboard drivers. 
 */
-#include <xen/sched.h>
+struct xen_regs;
 
 typedef void key_handler(unsigned char key);
 
 extern void add_key_handler(unsigned char key, 
                            key_handler *handler, char *desc); 
+extern void add_key_handler_no_defer(unsigned char key, 
+                                     key_handler *handler, char *desc); 
 
-extern void handle_keypress(unsigned char key);
-
+extern void handle_keypress(unsigned char key, struct xen_regs *regs);